package TeacherLegendAPI.Lambda;

import java.io.File;
import java.io.FileFilter;

/**
 * JDK8推出的一个新特性:lambda表达式
 * 可以面向函数式编程。
 *
 * 给我们的直观感受就是可以用更精简的语法创建匿名内部类。
 * 语法:
 * (参数列表)->{
 *     方法体
 * }
 */
public class LambdaDemo {
    public static void main(String[] args) {
        File file=new File(".");


        //匿名内部类形式定义文件过滤器
        FileFilter filter = new FileFilter() {
            public boolean accept(File file) {
                return file.getName().startsWith(".");
            }
        };
        /*
            可以使用lambda表达式创建的接口要求只能有一个抽象方法!
            java中凡是可以使用lambda表达式创建的接口都使用了注解:@FunctionalInterface
         */

        /**1.lambda表达式创建时省略了接口名和方法名

        FileFilter filter2 = (File file)->{
            return file.getName().startsWith(".");
        };

         */

        /**2.lambda表达式中参数的类型可以不写

        FileFilter filter3 = (file)->{
            return file.getName().startsWith(".");
        };

         */

        /**3.如果只有一个参数，那么参数列表的"()"可以忽略不写
        FileFilter filter4 = file->{
            return file.getName().startsWith(".");
        };
         */

        /**4.如果只有一句代码，那么"{}"可以忽略不写
        //如果这句代码中还有return,那么return也同样要忽略不写
        FileFilter filter5 = file->
             file.getName().startsWith(".");
         */

        /**5.以前使用匿名内部类的方法

        File[]subs=dir.listFiles(new FileFilter() {
            public boolean accept(File file) {
                return file.getName().startsWith(".");
            }
        });

         */

        //现在使用lambda表达式的写法
        File[]subs=file.listFiles(f->
                f.getName().startsWith("."));

    }
}
